<?php

namespace core\lib;

use yii\helpers\HtmlPurifier;


/**
 * 用户请求内容读取以及安全过滤类
 *
 * 使用说明——
 *
 * 所有用户端输入的内容（包括POST/GET/COOKIE)，都要使用R类进行安全过滤后才能使用。
 *
 * 数字用R::numeric($key,$default='')
 * 字符串用R::string($key,$default='')
 * 富文本用R::html($key,$default='')
 *
 * 以上过滤都不能满足的，需要读取存在安全隐患的内容的，需要经过技术负责人进行安全评估后，可以使用 R::not_safe($key,$default='')
 *
 */
class R
{

    /**
     *  获取数字类型的参数，
     *
     * @param 参数key string $key
     * @param 默认值 integer $default
     */
    public static function numeric($key, $default = 0)
    {
        $result = self::get_request($key, $default);
        if (is_array($result)) {
            foreach ($result as $k => $v) {
                $result[$k] = call_user_func(__METHOD__, NULL, $v);
            }
            return $result;
        } else {
            if (is_numeric($result)) {
                return $result;
            } else {
                return 0;
            }
        }
    }

    /**
     *  获取简单字符串类型的参数，
     *
     * @param 参数key string $key
     * @param 默认值 string $default
     */
    public static function string($key, $default = null)
    {
        $result = self::get_request($key, $default);

        if (is_array($result)) {
            foreach ($result as $k => $v) {
                $result[$k] = call_user_func(__METHOD__, NULL, $v);
            }
        } else {
            $result = trim($result);
            $result = strip_tags($result);
            $result = htmlspecialchars($result, ENT_QUOTES);
            $result = nl2br($result);
        }

        return $result;
    }

    /**
     *  获取富文本类型的参数，
     *
     * @param 参数key string $key
     * @param 默认值 string $default
     */
    public static function html($key, $default = null)
    {
        $result = self::get_request($key, $default);
        if (is_array($result)) {
            foreach ($result as $k => $v) {
                $result[$k] = call_user_func(__METHOD__, NULL, $v);
            }
            return $result;
        } else {
            return HtmlPurifier::process($result);
        }
    }

    /**
     * 非安全调用，使用前必须找技术负责人做安全评估。
     * @param string $key
     * @param string $default
     */
    public static function not_safe($key, $default = '')
    {
        return self::get_request($key, $default);
    }

    /**
     * 获取用户输入数据，如果存在相同key，取值优先顺序为：GET-POST-COOKIE
     * @param string $key
     * @param mixed $default
     */
    private static function get_request($key, $default = '')
    {
        if (isset($_GET[$key])) return $_GET[$key];
        if (isset($_POST[$key])) return $_POST[$key];
        if (isset($_COOKIE[$key])) return $_COOKIE[$key];
        if (isset($_REQUEST[$key])) return $_REQUEST[$key];

        return $default;
    }
}